/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.model;

/**
 * @author Administrador
 */
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.db.SqlManager;
import com.exception.DataException;
import com.javabeans.Carrera;
import com.javabeans.Categoria;
import com.javabeans.DetalleDocente;
import com.javabeans.Usuario;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class AdminUsuario implements UsuarioManager{
    private Connection c;

    public AdminUsuario(Connection c){
        this.c = c;
    }
    @Override
    public int getIdUsuario() throws DataException {
        int res = 0;
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "SELECT IFNULL(max(IDUSUARIO)+1,1) AS ID FROM USUARIO";
        try{
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            rs.next();
            res = rs.getInt("ID");
        }catch(SQLException e){
            throw new DataException(" AdminUsuario -> getIdUsuario() "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return res;
    }
    @Override
    public Usuario validarDocente(String login, String password) throws DataException{
        Usuario u = new Usuario();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT U.IDUSUARIO";
            query += ", U.NOMBRE";
            query += ", APELLIDO";
            query += ", EMAIL";
            query += ", FOTO";
            query += ", DATE_FORMAT(FECHANAC,'%d/%m/%Y') AS FECHANAC";
            query += ", LOGIN";
            query += " FROM USUARIO U, ROL_USUARIO R_U";
            query += " INNER JOIN ROL R ON R_U.IDROL=R.IDROL AND R.IDROL=2"; // idRol = 2 = docente
            query += " WHERE U.IDUSUARIO=R_U.IDUSUARIO";
            query += " AND U.LOGIN = '"+login;
            query += "' AND U.PASSWORD = '"+password;
            query += "' AND R_U.ACTIVO = 1";            
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            if(rs.next()){
                u.setIdUsuario(rs.getInt("IDUSUARIO"));
                u.setNombre(rs.getString("NOMBRE"));
                u.setApellido(rs.getString("APELLIDO"));
                u.setEmail(rs.getString("EMAIL"));
                u.setFoto(rs.getString("FOTO"));
                u.setFechaNac(rs.getString("FECHANAC"));
                u.setLogin(login);
            }
        }catch(SQLException ex){
            throw new DataException(" AdminUsuario -> validarDocente(login, password) e = "+ex.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return u;
    }
    
    public List<Usuario> getDocentesPorFacult(int idFacultad) throws DataException{
        List<Usuario> docentes = new ArrayList<Usuario>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT DISTINCT U.IDUSUARIO";
            query += ", U.NOMBRE, U.APELLIDO";
            query += ", DD.IDCATEGORIA";
            query += ", CD.IDCARRERA";
            query += ", C.NOMBRE";
            query += ", C.SIGLA";
            query += ", CA.NOMBRE";
            query += ", CA.SIGLA";
            query += " FROM USUARIO U";
            query += " INNER JOIN (DETALLE_DOCENTE DD INNER JOIN CATEGORIA CA ON DD.IDCATEGORIA=CA.IDCATEGORIA) ON U.IDUSUARIO=DD.IDDETALLE_DOCENTE";
            query += ", CARRERA_DOCENTE CD";
            query += " INNER JOIN CARRERA C ON CD.IDCARRERA=C.IDCARRERA AND C.IDFACULTAD="+idFacultad;
            query += " WHERE U.IDUSUARIO=CD.IDDOCENTE";
            query += " AND CD.ACTIVO=1";
            query += " ORDER BY U.NOMBRE, U.APELLIDO";            
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Usuario d = new Usuario();
                d.setIdUsuario(rs.getInt("U.IDUSUARIO"));
                d.setNombre(rs.getString("U.NOMBRE"));
                d.setApellido(rs.getString("U.APELLIDO"));
                DetalleDocente dd = new DetalleDocente();
                Categoria ca = new Categoria();
                ca.setNombre(rs.getString("CA.NOMBRE"));
                ca.setSigla(rs.getString("CA.SIGLA"));
                dd.setCategoria(ca);
                d.setDetalleDocente(dd);
                docentes.add(d);
            }
        }catch(SQLException e){
            throw new DataException(" -> getCarreraDocentesGener(int idFacultad) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return docentes;
    }

    @Override
    public void saveUsuario(Usuario u) throws DataException {
        PreparedStatement preSt = null;
        String query;
        try{
            query ="INSERT INTO USUARIO VALUES("+u.getIdUsuario();
            query+= ", '"+u.getNombre().toUpperCase();
            query+= "', '"+u.getApellido().toUpperCase();
            query+= "', '"+u.getCi();
            query+= "', '"+u.getExpedidoEn().toUpperCase();
            query+= "', '"+u.getGenero();
            query+= "', '"+u.getTelefono();
            query+= "', '"+u.getEmail();
            query+= "', '"+u.getDireccion().toUpperCase();
            query+= "', '"+u.getFechaNac();
            query+= "', '"+u.getFoto();
            query+= "', '"+u.getLogin();            
            query+= "', '"+u.getPassword()+"')";            
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" AdminUsuario -> saveUsuario(Usuario u) "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }

    public void updateUsuario(Usuario u) throws DataException {
        PreparedStatement preSt = null;
        try{
            String query = "UPDATE USUARIO SET NOMBRE = '"+u.getNombre().toUpperCase();
            query+= "', APELLIDO = '"+u.getApellido().toUpperCase();
            query+= "', CI = '"+u.getCi();
            query+= "', EXPEDIDOEN = '"+u.getExpedidoEn().toUpperCase();
            query+= "', GENERO = '"+u.getGenero();
            query+= "', TELEFONO = '"+u.getTelefono();
            query+= "', EMAIL = '"+u.getEmail();
            query+= "', DIRECCION = '"+u.getDireccion().toUpperCase();
            query+= "', FECHANAC = '"+u.getFechaNac();
            query+= "' WHERE IDUSUARIO="+u.getIdUsuario();
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" AdminUsuario -> updateUsuario(Usuario u) e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }

    public boolean existeDocente(int idDocente) throws DataException {
        boolean res = false;
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "SELECT IDDOCENTE";
        query += " FROM CARRERA_DOCENTE";
        query += " WHERE IDDOCENTE = "+idDocente;
        query += " LIMIT 1";
        try{
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            if(rs.next())
                res = true;
        }catch(SQLException e){
            throw new DataException(" AdminUsuario -> existeDocente(idDocente) "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return res;
    }
    @Override
    public void deleteDocente(int idDocente) throws DataException {
        PreparedStatement preSt = null;
        String query = "DELETE FROM DETALLE_DOCENTE WHERE IDDETALLE_DOCENTE="+idDocente;
        try{
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
            // ahora eliminamos sus dependencia :)
            query = "DELETE FROM USUARIO WHERE IDUSUARIO="+idDocente;
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
            query = "DELETE FROM ROL_USUARIO WHERE IDUSUARIO="+idDocente;
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException e){
            throw new DataException(" AdminUsuario -> deleteDocente(idDocente) e = "+e.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }

    public boolean existeLogin(String login) throws DataException {
        boolean res = false;
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            preSt = c.prepareStatement("SELECT LOGIN FROM USUARIO WHERE LOGIN='"+login+"'");
            rs = preSt.executeQuery();
            if(rs.next()){
                res = true;
            }
        }catch(SQLException e){
            throw new DataException(" AdminUsuario -> existeLogin(String login) "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return res;
    }
    
}
